package mx.com.ingsw.service;


import java.security.NoSuchAlgorithmException;
import java.util.List;
import mx.com.ingsw.dao.AlumnoDAO;
import mx.com.ingsw.dao.AsignaturaDAO;
import mx.com.ingsw.dao.DatosDAO;
import mx.com.ingsw.dao.GrupoDAO;
import mx.com.ingsw.dao.InscripcionDAO;
import mx.com.ingsw.dao.exceptions.NonexistentEntityException;
import mx.com.ingsw.model.Alumno;
import mx.com.ingsw.model.Datos;
import mx.com.ingsw.model.Grupo;
import mx.com.ingsw.model.GrupoPK;
import mx.com.ingsw.model.Inscripcion;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

@Service("ServicioAlumno")
@Scope("request")
public class ServiceAlumno {//Agrege Http
    AlumnoDAO ad=new AlumnoDAO();
    ValidaCampos vc=new ValidaCampos();
    Verificacion ve=new Verificacion();
    GrupoDAO gd=new GrupoDAO();
    InscripcionDAO id=new InscripcionDAO();
    Inscripcion ins= new Inscripcion();
    AsignaturaDAO da=new AsignaturaDAO();
    GrupoDAO dg=new GrupoDAO();
    InscripcionDAO dins=new InscripcionDAO();
    AlumnoDAO alumnoDAO = new AlumnoDAO();
    DatosDAO datosDAO = new DatosDAO();
    
       public String validar(Alumno alu) throws Exception{                         //Inicia Metodo para Validar los datos de Acceso al Usuario
       Alumno albd = ad.read(alu.getNoCuenta());                                //Se Lee  el No de Cuenta dado desde el navegador 
       if(albd==null)                                                           //Primero Verificamos que exista en la B.D.
           return "Usuario no registrado";                                                           //De no existir los datos (null) mostraremos mensaje: No existe el Alumno
       if (vc.cuenta(alu.getNoCuenta())==false)
        return"El número de cuenta contiene 9 digitos sin guiones ni espacios";//
       if (vc.password(alu.getPasswordAlu())==false)
        return"La contraseña debe tener 8 digitos";//La contraseña debe tener 8 digitos
       
       String aux=ve.validaH(albd);
       if (!"Exito".equals(aux))
        return aux;//La contraseña debe tener 8 digitos
       
       if((int)albd.getNoCuenta()==(int)alu.getNoCuenta() )                               //Despues Verificamos que el No. de Cuenta coincida con el No. Cuenta de la B.D.
            if(alu.getPasswordAlu().equals(albd.getPasswordAlu()))              //De igual manera Verificamos la contraseña con la B.D
                //if(albd.getEdoSesion()==0)
                return "Exito";                                                //Una vez verificados los datos lo direccionamos a la pagina de Altas
                //else        
                   // return "Ya estas inscrito";                                                      //En caso de no coincidir la contraseña se mostrara un mensaje de error: Contraseña Erronea
            else
                return "Datos incorrectos";
       else
       return "Datos incorrectos";
       
       //En caso de no concidir el No. de cuenta se mostrara un mensaje de erorr: No. de Cuenta Erronea
    }//Termina Metodo para Validar los datos de Acceso al Usuario
    /*public String tiempos () throws Exception{
    Temporizador t=new Temporizador();
    String aux=t.getTempo();
    return aux;
    }*/
    public String Alta (Alumno alu, GrupoPK pk) throws Exception{      //Inicia Metodo para dar de Alta al Usuario
     
        Grupo grbd=gd.read(pk);                          //se obtiene a un alumno de la base con pk
      if(grbd == null)                           //si es nulo no existe el alumno
          return "El Grupo no existe";                             //regresa mensaje contraseña o nocuenta erroneo
      if(grbd.getVacantes()==0)                  //verifica si hay vacantes
          return "No hay vacantes";                             //De no haber lugares se regresa un mensaje no hay vacantes
      if(id.validaInscripcion(alu.getNoCuenta(),pk.getIdAsignatura()) != -1 ) //Verificamos los datos con la tabla de Inscripciones
          //Si es diferente a -1, significa que ya la tiene inscrita
          return "Ya inscribiste esta materia"; //Mensaje: Ya esta Inscrita la Materia
      //Como no esta inscrita...
      String aux=ve.validaMat(id.busca(alu.getNoCuenta()) , da.read(pk.getIdAsignatura()) );
      if(!"Exito".equals(aux))
          return aux;
      String aux2=ve.validaSeriacion(alu.getNoCuenta(), pk.getIdAsignatura());
      if(!"Exito".equals(aux2))
          return aux2;
      String aux3=ve.validaLab(pk.getIdAsignatura(),id.busca(alu.getNoCuenta()));
      if(!"Exito".equals(aux3))
          return aux3;
      String aux4 = ve.ValidaBloqueMovil(alu, grbd);
      if(!"Exito".equals(aux4))
          return aux4;
      String aux5 = ve.ValidaHorarioGrupo(grbd, alu);
      if(!"Exito".equals(aux5))
          return aux5;
      ins.setIdAsignatura(pk.getIdAsignatura()); //Se manda la Asignatura a inscripciones
      ins.setIdGrupo(pk.getNumeroGrupo());           //Se manda el Grupo a Inscripciones
      ins.setNoCuenta(alu.getNoCuenta());         //Se manda el No. de Cuenta del Alumno Inscrito en la Asignatura a Inscripciones
      id.create(ins);                // Se registra la Inscripcion en la Tabla de Inscripciones de la B.D
      int vaca =grbd.getVacantes();    //Obtenemos de la B.D. las vacantes de la Asignatura
      vaca=vaca-1;                     //Disminuimos 1 vacante
      grbd.setVacantes(vaca);          //Mandamos las nuevas vacantes al Grupo de la Asignatura
      gd.update(grbd);                 //Se registran las nuevas vacantes en el Grupo de la B.D
         
      return "Exito";
  } //Termina Metodo para dar de Alta al Usuario
  
  public String Baja (Alumno alu, GrupoPK pk) throws Exception{   //Inicia Metodo para dar de Baja al Usuario
      Grupo grbd=dg.read(pk);                               //Se obtiene a un alumno de la base con pk
      int ind = -1;
      if(grbd == null)          //Primero Verificamos que exista el Alumno en la B.D.
          return "El grupo no existe";            //De no existir los datos (null) mostraremos mensaje error: No existe el Alumno
      
   if(dins.validaInscripcion(alu.getNoCuenta(),pk.getIdAsignatura())==-1)//verifica que se halla dado de alta la materia
           return"No has dado de alta la materia";//mada un mensaje de error no no ser asi
        else {//Verificamos que este inscrito en la tabla de Inscripciones
            //comparamos que el grupo sea en el que esta inscrito
            List<Inscripcion> li=dins.busca(alu.getNoCuenta());
            for(int i=0;i<li.size();i++)
                if(li.get(i).getIdGrupo()==pk.getNumeroGrupo())
                    ind=i;
            if(ind!=-1)
                grbd.setVacantes(grbd.getVacantes()+1);
            else
                return "No estas inscrito en este grupo";
            dins.delete(dins.validaInscripcion(alu.getNoCuenta(),pk.getIdAsignatura()));//Se manda el numero id de la inscripcion  al metodo y se procede a dar de Baja la Asignatura
            dg.update(grbd); //Se registran las nuevas vacantes en el Grupo de la B.D
        }
    return "Exito";
    }//Termina Metodo para dar de Baja al Usuario*/
  
    public String Baja (Alumno alu, int id_asignatura) throws NonexistentEntityException, Exception{
        GrupoPK pk = new GrupoPK();
        pk.setIdAsignatura(id_asignatura);
        Grupo grbd;
        Inscripcion aux;
        aux = ve.ValidaBaja(dins.busca(alu.getNoCuenta()), id_asignatura);
        if(aux == null)
            return "No has inscrito la materia";
        pk.setNumeroGrupo(aux.getIdGrupo());
        grbd = dg.read(pk);
        grbd.setVacantes(grbd.getVacantes()+1);
        dins.delete(aux.getIdInscripcion());//Se manda el numero id de la inscripcion  al metodo y se procede a dar de Baja la Asignatura
        dg.update(grbd); //Se registran las nuevas vacantes en el Grupo de la B.D
        return "Exito";
    }
    public List<Inscripcion> ConsultaInscripcion (Alumno alu) throws Exception{ //Inicia Metodo para Consultar una Iscripcion del Usuario
        InscripcionDAO dins=new InscripcionDAO();
        return dins.busca(alu.getNoCuenta());//Se manda el No. de cuenta a Inscripcion para buscar en las Inscripciones realizadas
     }
    
     public String Cambio (Alumno alu,GrupoPK pk) throws Exception{ //Inicia Metodo para Cambiar una Asignatura del Usuario
        Grupo grbd=dg.read(pk);                         //tomo de la bd al grupo nuevo
        if(grbd==null)                            //verifico si el grupo existe
            return"El grupo no existe";//Dado que no existe se manda un error: Grupo inválido-no existe   
        int aux =dins.validaInscripcion(alu.getNoCuenta(), pk.getIdAsignatura()); //obtengo el IDinscripcion del grupo viejo
        if (aux == -1)                                       //verifico si ya lo ha dado de alta
            return"No has dado de alta la materia";                                       //no estas inscrito
                
        ins=dins.read(aux);                                  //guardo en ins el registro del grupo viejo
        GrupoPK pk2=new GrupoPK(ins.getIdGrupo(),ins.getIdAsignatura());//creo grupo viejo
        //ins.setIdAsignatura(asignatura);
        Grupo grbd2= dg.read(pk2);
        ins.setIdGrupo(pk.getNumeroGrupo());                  //cambio en ins el grupo viejo por el nuevo
        if(grbd.getVacantes()==0)               //verifico si el grupo nuevo tiene vacantes antes de hacer le cambio definitivo
            return"NO hay vacantes en el grpo a cambiar";//No hay vacantes en el grupo a cambiar
        String aux1=ve.validaMat(id.busca(alu.getNoCuenta()) , da.read(pk.getIdAsignatura()) );
      if(!"Exito".equals(aux1))
          return aux1;
      String aux2=ve.validaSeriacion(alu.getNoCuenta(), pk.getIdAsignatura());
      if(!"Exito".equals(aux2))
          return aux2;
      String aux3=ve.validaLab(pk.getIdAsignatura(),id.busca(alu.getNoCuenta()));
      if(!"Exito".equals(aux3))
          return aux3;
      String aux4 = ve.ValidaBloqueMovil(alu, grbd);
      if(!"Exito".equals(aux4))
          return aux4;
      String aux5 = ve.ValidaHorarioGrupo(grbd, alu);
      if(!"Exito".equals(aux5))
          return aux5;
        dins.update(ins);                       //realizo el cambio en la bd
        grbd.setVacantes((int)grbd.getVacantes()-1);
        grbd2.setVacantes((int)grbd2.getVacantes()+1);
        dg.update(grbd); //cambio las vacantes del grupo nuevo
        dg.update(grbd2);//cambio las vacantes del grupo viejo
        //dg.update(grbd); //Se registran las nuevas vacantes en el Grupo de la B.D
        
        return "Exito";//Termina Metodo para Cambiar una Asignatura del Usuario...Te cambiaste de Grupo ;)
}

    public Datos datos(Alumno alum) throws NoSuchAlgorithmException {
        alum=alumnoDAO.read(alum.getNoCuenta());
        return datosDAO.read(alum.getIdDatos());
    }


    public String enviaPass(Alumno alum) throws Exception {
        Mail mail = new Mail();
        alum=ad.read(alum.getNoCuenta());
        if (alum==null)
            return "No. de cuenta erroneo";
        Datos datos=datosDAO.read(alum.getIdDatos());
        String notif=mail.envia(datos.getCorreo(), alum);
        if("Exito".equals(notif)){
        return ("Tu contraseña se ha enviado al correo: "+datos.getCorreo());    
        }
        else return notif;    
    }


}